package api

import (
	"github.com/labstack/echo/v4"
	"longmen/server/config/global"
	"longmen/server/pkg/common/helper/const"
	"longmen/server/pkg/common/helper/util"
	grpc_client2 "longmen/server/pkg/grpc_client"
	pb "longmen/server/pkg/protobuf"
)

// @Summary 主播创建直播计划
// @Description
// @Accept  json
// @Produce  json
// @Tags Live
// @Param   sendBody body protobuf.AnchorLivePlanCreate true "body"
// @Success 200 {object} protobuf.AnchorLivePlan "result"
// @Router /api/live/anchor_plan_create [POST]
func (base *Controller) AnchorLivePlanCreate(c echo.Context) error {
	r := &pb.AnchorLivePlanCreate{}
	if err := util.Json2Struct(c.Get("body").(string), r); err != nil {
		return util.BadParam(c, err)
	}
	if err := _const.Validate.Struct(r); err != nil {
		return util.BadParam(c, err)
	}
	ctx, cancel := base.GrpcWithTimeout()
	defer cancel()
	resp, err := grpc_client2.GrpcLiveServer.LiveAnchorPlanCreate(ctx, r)
	if err != nil {
		global.Log.Errorf("%+v", resp, err)
		return util.BuildFail(c, _const.RPC_FAILED, err.Error(), err)
	}
	return util.BuildSuccess(c, resp, "")
}

// @Summary 主播取消直播计划
// @Description
// @Accept  json
// @Produce  json
// @Tags Live
// @Param   sendBody body protobuf.AnchorLivePlanCancelReq true "body"
// @Success 200 {object} protobuf.AnchorLivePlan "result"
// @Router /api/live/anchor_plan_cancel [POST]
func (base *Controller) AnchorLivePlanCancel(c echo.Context) error {
	user, err := base.GetUserByCtx(c)
	if err != nil {
		return util.BuildLoginTimeOut(c, err)
	}
	r := &pb.AnchorLivePlanCancelReq{}
	if err := util.Json2Struct(c.Get("body").(string), r); err != nil {
		return util.BadParam(c, err)
	}
	if err := _const.Validate.Struct(r); err != nil {
		return util.BadParam(c, err)
	}
	r.Anchorid = int64(user.Id)
	ctx, cancel := base.GrpcWithTimeout()
	defer cancel()
	resp, err := grpc_client2.GrpcLiveServer.LiveAnchorPlanCancel(ctx, r)
	if err != nil {
		global.Log.Errorf("%+v", resp, err)
		return util.BuildFail(c, _const.RPC_FAILED, err.Error(), err)
	}
	return util.BuildSuccess(c, resp, "")
}

// @Summary 主播直播计划列表
// @Description
// @Accept  json
// @Produce  json
// @Tags Live
// @Param   sendBody body protobuf.AnchorLivePlanReq true "body"
// @Success 200 {object} protobuf.AnchorLivePlan "result"
// @Router /api/live/anchor_plan [POST]
func (base *Controller) AnchorLivePlan(c echo.Context) error {
	r := &pb.AnchorLivePlanReq{}
	if err := util.Json2Struct(c.Get("body").(string), r); err != nil {
		return util.BadParam(c, err)
	}
	if err := _const.Validate.Struct(r); err != nil {
		return util.BadParam(c, err)
	}
	ctx, cancel := base.GrpcWithTimeout()
	defer cancel()
	resp, err := grpc_client2.GrpcLiveServer.LiveAnchorPlan(ctx, r)
	if err != nil {
		global.Log.Errorf("%+v", resp, err)
		return util.BuildFail(c, _const.RPC_FAILED, err.Error(), err)
	}
	return util.BuildSuccess(c, resp, "")
}

// @Summary 主播直播计划列表(未开播)
// @Description
// @Accept  json
// @Produce  json
// @Tags Live
// @Success 200 {object} protobuf.AnchorLivePlan "result"
// @Router /api/live/by_anchor_plan [POST]
func (base *Controller) ByAnchorLivePlan(c echo.Context) error {
	user, err := base.GetUserByCtx(c)
	if err != nil {
		return util.BuildLoginTimeOut(c, err)
	}

	r := &pb.AnchorLivePlanReq{}
	if err := util.Json2Struct(c.Get("body").(string), r); err != nil {
		return util.BadParam(c, err)
	}
	if err := _const.Validate.Struct(r); err != nil {
		return util.BadParam(c, err)
	}
	ctx, cancel := base.GrpcWithTimeout()
	defer cancel()
	resp, err := grpc_client2.GrpcLiveServer.LiveByAnchorPlan(ctx, &pb.ByAnchorLivePlanReq{
		Id: int64(user.Id),
	})
	if err != nil {
		global.Log.Errorf("%+v", resp, err)
		return util.BuildFail(c, _const.RPC_FAILED, err.Error(), err)
	}
	return util.BuildSuccess(c, resp, "")
}

// @Summary 主播直播计划-直接开播
// @Description
// @Accept  json
// @Produce  json
// @Tags Live
// @Param   sendBody body protobuf.PlanStartLiveReq true "body"
// @Success 200 {object} protobuf.PlanStartLiveResp "result"
// @Router /api/live/plan_start_live [POST]
func (base *Controller) PlanStartLive(c echo.Context) error {
	user, err := base.GetUserByCtx(c)
	if err != nil {
		return util.BuildLoginTimeOut(c, err)
	}

	r := &pb.PlanStartLiveReq{}
	if err := util.Json2Struct(c.Get("body").(string), r); err != nil {
		return util.BadParam(c, err)
	}
	r.Uid = int64(user.Id)
	if err := _const.Validate.Struct(r); err != nil {
		return util.BadParam(c, err)
	}
	ctx, cancel := base.GrpcWithTimeout()
	defer cancel()
	resp, err := grpc_client2.GrpcLiveServer.PlanStartLive(ctx, &pb.PlanStartLiveReq{
		Id:  r.Id,
		Uid: int64(user.Id),
	})
	if err != nil {
		global.Log.Errorf("%+v", resp, err)
		return util.BuildFail(c, _const.RPC_FAILED, err.Error(), err)
	}
	return util.BuildSuccess(c, resp, "")
}
